//
// Created by ASUS on 2025/4/9/星期三.
//
#include <bits/stdc++.h>
using namespace std;

struct Node{
	int l,r;
	int len=0;
	int cnt=0;
};

class SegmentTree{
public:
	vector<Node> t;
	explicit SegmentTree(int n){
		t.resize(4*n);
	}
	~SegmentTree()= default;

	void build(int i,int l,int r){
		t[i].l=l;
		t[i].r=r;
		if(l==r){
			return;
		}
		int mid=l+(r-l)/2;
		build(i*2,l,mid);
		build(i*2+1,mid+1,r);
	}

	int query(){
		return t[1].len;
	}

	void update(int i,int l,int r,int type){
		if(t[i].l>r||t[i].r<l) return ;
		if(t[i].l>=l&&t[i].r<=r){
			t[i].cnt+=type;
			return ;
		}
		update(2*i,l,r,type);
		update(2*i+1,l,r,type);
		if(t[i].cnt>0){
			t[i].len=t[i].r-t[i].l;
		}else if(t[i].l==t[i].r-1){
			t[i].len=0;
		}else{
			t[i].len=t[2*i].len+t[2*i+1].len;
		}
	}

	void update(int l,int r,int v){
		update(1,l,r,v);
	}
};

struct Line{
	int x;
	int y1,y2;
	int type;
	bool operator<(const Line&l)const{
		return x<l.x;
	}
};

int rectangleArea(vector<vector<int>> rectangles){
	int n=rectangles.size();
	vector<Line> lines(n*2);
	vector<int> y(n*2);
	for(int i=0;i<n;i++){    // 左上角线段
		lines[i*2].x=rectangles[i][0];
		lines[i*2].y1=rectangles[i][1];
		lines[i*2].y2=rectangles[i][3];
		lines[i*2].type=1;

		lines[i*2+1].x=rectangles[i][2];
		lines[i*2+1].y1=rectangles[i][1];
		lines[i*2+1].y2=rectangles[i][3];
		lines[i*2+1].type=-1;

		y[i*2]=rectangles[i][1];
		y[i*2+1]=rectangles[i][3];
	}
	sort(lines.begin(),lines.end());
	sort(y.begin(),y.end());
	y.erase(unique(y.begin(),y.end()),y.end());
	int m=y.size();
	SegmentTree seg(m);
	seg.build(1,1,m-1);
	int ans=0;
	int lastx=lines[0].x;
	for(auto&line:lines){
		ans+=(line.x-lastx)*seg.query();
		seg.update(1,line.y1,line.y2,line.type);
		lastx=line.x;
	}
	return ans;
}